package com.im.codec.utils;

import com.alibaba.fastjson.JSONObject;
import com.im.codec.proto.Message;
import com.im.codec.proto.MessageHeader;
import io.netty.buffer.ByteBuf;

public class ByteBufToMessageUtils {

    public static Message transition(ByteBuf byteBuf){
        // 获取指令
        int command = byteBuf.readInt();
        // 获取版本
        int version = byteBuf.readInt();
        // 获取客户端好类型
        int clientType = byteBuf.readInt();
        // 获取消息类型
        int messageType = byteBuf.readInt();
        // 获取appId
        int appId = byteBuf.readInt();
        // 获取imei长度
        int imeiLength = byteBuf.readInt();
        // 获取请求体长度
        int bodyLength = byteBuf.readInt();

        // 检查可读取的字节数是否足够解析整个消息，如果不够则返回 null
        if (byteBuf.readableBytes() < bodyLength + imeiLength) {
            byteBuf.resetReaderIndex();
            return null;
        }

        // 读取imei号数据并转换成字符串类型
        byte[] imeiData = new byte[imeiLength];
        byteBuf.readBytes(imeiData);
        String imei = new String(imeiData);

        // 读取消息体数据
        byte[] bodyData = new byte[bodyLength];
        byteBuf.readBytes(bodyData);

        // 构造消息头对象
        MessageHeader messageHeader = new MessageHeader();
        messageHeader.setAppId(appId);
        messageHeader.setClientType(clientType);
        messageHeader.setCommand(command);
        messageHeader.setLength(bodyLength);
        messageHeader.setVersion(version);
        messageHeader.setMessageType(messageType);
        messageHeader.setImei(imei);

        // 构造消息对象
        Message message = new Message();
        message.setMessageHeader(messageHeader);

        // 如果消息类型为 0x0，则解析消息体为 JSON 格式
        if (messageType == 0x0) {
            String body = new String(bodyData);
            JSONObject parse = (JSONObject) JSONObject.parse(body);
            message.setMessagePack(parse);
        }

        // 标记读指针位置
        byteBuf.markReaderIndex();
        return message;
    }


}
